package cn.doitedu.rtmk.demo7.bitmap_test;

import org.roaringbitmap.longlong.Roaring64Bitmap;

import java.io.*;

public class BitmapDemo {
    public static void main(String[] args) throws IOException {

        // 构造 RoaringBitmap(第三方bitmap工具包)  : bitmap
        Roaring64Bitmap bitmap = Roaring64Bitmap.bitmapOf(1, 3, 56);


        // 往bitmap中添加数据
        bitmap.add(20,23);
        bitmap.add(20,25);


        // bitmap序列化
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        DataOutputStream dataOut = new DataOutputStream(byteOut);

        // 将bitmap对象，序列化到dataOut流中，而dataOut流其实是写到byteOut流中
        bitmap.serialize(dataOut);
        // 将byteOut流，转成字节数组，即得到序列化的字节数组
        byte[] bitmapBytes = byteOut.toByteArray();


        // bitmap反序列化
        // 先构造一个空的bitmap对象
        Roaring64Bitmap bitmapNew = Roaring64Bitmap.bitmapOf();

        ByteArrayInputStream byteIn = new ByteArrayInputStream(bitmapBytes);
        DataInputStream dataIn = new DataInputStream(byteIn);
        // 然后将dataIn里面的字节数据反序列化到新的bitmap对象中，
        // 而dataIn里面的数据其实来自于包装的字节流，而字节流其实包装的就是上面的字节数组
        bitmapNew.deserialize(dataIn);


        // 判断bitmap是否包含指定数据
        boolean contains1 = bitmapNew.contains(26);
        boolean contains2 = bitmapNew.contains(23);
        boolean contains3 = bitmapNew.contains(3);
        System.out.println(contains1);
        System.out.println(contains2);
        System.out.println(contains3);


    }
}
